//
// Created by F1997 on 2024/10/21.
//

#ifndef NETWORK_TRAFFIC_PROCESSING_PCAPUTILS_H
#define NETWORK_TRAFFIC_PROCESSING_PCAPUTILS_H
#include "pch.h"
#include "../main/CompareTraffic.h"
#include "IniReader.h"



class PcapUtils {
public:
    PcapUtils() = default;

    // 列表初始化和优化，{}还是()???
    PcapUtils(std::shared_ptr<spdlog::logger> _my_logger ) //, IniReader* _iniCfg, CompareTraffic _compareTraffic)
    //: my_logger(_my_logger), iniCfg(_iniCfg)
    //compareTraffic(_compareTraffic)
    {
        my_logger = _my_logger;
        //iniCfg = _iniCfg;
        //compareTraffic = new CompareTraffic(iniCfg);

    };

    void readPcapFile();

    bool checkIsStart(std::chrono::system_clock::time_point startTime, int offset);

    int readNetworkIfaceLine1(std::chrono::system_clock::time_point startTime, IniReader* iniCfg);
    int readNetworkIfaceLine2(std::chrono::system_clock::time_point startTime, IniReader* iniCfg);

    int readNetworkIface2();
    int readNetworkIface();
    int readNetworkInterface();

    int readNetworkIface4();
    int readMsg(std::shared_ptr<spdlog::logger> my_logger, IniReader* iniCfg);
    int sampled(std::shared_ptr<spdlog::logger> _my_logger, IniReader* iniCfg);

    std::chrono::system_clock::time_point parseTime(const std::string& timeStr);
    std::chrono::system_clock::time_point string_to_time_point(const std::string& str);
    time_t parse_date_to_timestamp(const std::string& date_str);

    void parse_packet(const struct pcap_pkthdr* pkthdr, const u_char* packet);

private:
    // 流量对比类
    std::shared_ptr<spdlog::logger> my_logger;
    //CompareTraffic compareTraffic;
    CompareTraffic compareTraffic;


    // 结构体是由pcap_loop自己填充的，用来取得一些关于数据包的信息
    struct my_pcap_pkthdr {
        struct timeval ts;   /* 时间戳 */
        bpf_u_int32 caplen;   /* 已捕获部分的长度 */
        bpf_u_int32 len;  /* 该包的脱机长度 */
    };

    // 定义以太网头部结构
    struct my_ether_header {
        u_int8_t ether_dhost[6]; // 目的MAC地址
        u_int8_t ether_shost[6]; // 源MAC地址
        u_int16_t ether_type;    // 协议类型
    };

    // 定义IP头部结构
    struct my_ip_header {
        u_int8_t ip_hl : 4, ip_v : 4; // IP头部长度和版本
        u_int8_t ip_tos;              // 服务类型
        u_int16_t ip_len;             // 总长度
        u_int16_t ip_id;              // 标识
        u_int16_t ip_off;             // 标志和段偏移
        u_int8_t ip_ttl;              // 生存时间
        u_int8_t ip_p;                // 协议
        u_int16_t ip_sum;             // 校验和
        struct in_addr ip_src;        // 源IP地址
        struct in_addr ip_dst;        // 目的IP地址
    };

    // 定义TCP头部结构
    struct my_tcp_header {
        u_int16_t th_sport;           // 源端口
        u_int16_t th_dport;           // 目的端口
        u_int32_t th_seq;             // 序列号
        u_int32_t th_ack;             // 确认号
        u_int8_t th_off : 4, th_x2 : 4; // 数据偏移和保留位
        u_int8_t th_flags;            // 标志
        u_int16_t th_win;             // 窗口大小
        u_int16_t th_sum;             // 校验和
        u_int16_t th_urp;             // 紧急指针
    };

};


#endif //NETWORK_TRAFFIC_PROCESSING_PCAPUTILS_H
